﻿#ifndef __LOG2810__etat__
#define __LOG2810__etat__

/*
 *  • Etat qui decrit un etat d’un automate. Il precise si un etat est initial ou terminal, ainsi que la
 *  liste des transitions dont cet etat est la source. Un etat est identiﬁe par un nombre entier.
 */

#include <iostream>
#include <string>
#include <list>
#include <vector>
#include "Transition.h"

class Transition; // déclaration anticipée
class Etat {
    
public:

    // Constructeur par defaut
    Etat();
	// Constructeur par parametre sans transitions (possible si c'est un etat final par exemple)
	Etat(int etat,bool initial, bool terminal);
    // Constructeur par parametre avec transitions
    Etat(int etat,bool initial, bool terminal, std::list<Transition*> transition);
    // Destructeur
    ~Etat();

	//fonctions sur m_etat
	int getEtat();
	void setEtat(int etat);

	//fonctions sur m_initial
	bool getInitial();
	void setInitial(bool initial);

	//fonctions sur m_terminal
	bool getTerminal();
	void setTerminal(bool terminal);

	//fonctions sur m_transitions
	std::list<Transition*> getTransitions();
	void setTransition(std::list<Transition*> transitions);
  
	/*
	 * Ajoutez a la classe Etat, la methode boolean existeTransition(char e) qui dit s’il existe ou
	 * non une transition portant l’etiquette e qui part de l’´etat considere.
	 */
	bool existeTransition(char e);

	/*
	 * Ajoutez a la classe Etat, la methode ListeEtat cible(char e) qui retourne l’ensemble des etats
	 * de destination des transitions portant l’etiquette e et partant de l’´etat considere. Il s’agit des
	 * successeurs de l’etat courant pour une etiquette donnee.
	 */
	std::list<Etat> cible(char e);

	/*
	 * Ajoutez a la classe Etat, la methode ListeEtat cible() qui retourne l’ensemble de tous les etats
	 * de destination pour toutes les transitions qui partent de l’etat considere. Il s’agit de tous les
	 * successeurs de l’etat courant pour tous les symboles.
	 */
	std::list<Etat> cible();

	/*
	 * Ajoutez a la classe Etat, la methode void ajouterTransition(ListeEtiquettes c, Etat e) qui
	 * permet d’ajouter une transition qui part de l’etat courant pour l’etat de destination e et portant
	 * un ensemble ou liste de symboles c.
	 */
	void ajouterTransition(std::vector<char> c, Etat* e);

	/*
	 *  Ajoutez a la classe Etat, la methode ListeEtiquettes listerEtiquettes() qui retourne l’ensemble
	 * des symboles etiquetant toutes les transitions qui partent de l’etat courant.
	 */
	std::vector<char> listerEtiquettes();


private:
    bool m_initial;
	bool m_terminal;
	int m_etat;
	//a voir si le conteneur "list" est le plus adequate
    std::list<Transition*> m_transitions;
};

#endif /* defined(__LOG2810__etat__) */